跳至主要内容

建立 Git 子倉庫

目標: 在 A 專案中建立 B 專案,並將 B 專案作為獨立倉庫,透過 git submodule 的方式引入到 A 專案中。


一、為什麼使用子倉庫(submodule)

使用 git submodule 的核心原因是:

  • B 專案可以獨立開發、獨立發佈
  • A 專案只引用 B 的某個確定版本
  • 多個專案可以複用同一個 B
  • 避免把所有程式碼都塞進一個倉庫(假 monorepo)

適合場景:

  • SDK / 工具庫
  • 基礎元件
  • 需要獨立 CI / release 的模組

二、整體流程概覽

  1. 在 A 專案中建立 B 專案目錄
  2. 初始化 B 專案為獨立 Git 倉庫
  3. 使用 gh 建立遠端倉庫並推送
  4. 將 B 專案作為 submodule 新增回 A 專案
  5. 提交 A 專案的 submodule 變更

三、在 A 專案中建立 B 專案

進入 A 專案根目錄:

cd A-project

建立 B 專案目錄(示例):

mkdir -p packages/B-project
cd packages/B-project

四、初始化 B 專案倉庫

1. 初始化 Git

git init

2. 建立初始提交(必須)

echo "# B-project" > README.md
git add .
git commit -m "chore: initial commit"

⚠️ submodule 不能引用一個沒有 commit 的倉庫


五、使用 GitHub CLI 建立遠端倉庫

確保已登入 GitHub:

gh auth status

建立並推送倉庫(fish / bash 通用寫法):

gh repo create B-project --private --source=. --remote=origin --push

如果是 public 倉庫,將 --private 改為 --public

驗證遠端倉庫:

git remote -v

六、將 B 專案作為子倉庫加入 A 專案

1. 回到 A 專案根目錄

cd ../../

2. 刪除本機 B 目錄(關鍵步驟)

rm -rf packages/B-project

⚠️ submodule 會自行 clone 倉庫,本機目錄必須為空


3. 新增 submodule

git submodule add https://github.com/<使用者名稱或組織>/B-project.git packages/B-project

成功後會產生:

  • packages/B-project/
  • .gitmodules

七、提交 A 專案的 submodule 變更

git add .gitmodules packages/B-project
git commit -m "chore: add B-project as submodule"
git push

八、日常開發與更新流程

1. 開發 B 專案

cd packages/B-project
git checkout main

修改並提交:

git add .
git commit -m "feat: xxx"
git push

2. 在 A 專案中更新子倉庫版本

cd ../../
git status

會看到:

modified: packages/B-project (new commits)

提交更新:

git add packages/B-project
git commit -m "chore: bump B-project submodule"
git push

九、Clone 含 submodule 的專案

推薦方式(一次性)

git clone --recurse-submodules <A-project-repo>

已 clone 專案補拉子倉庫

git submodule update --init --recursive

十、常見坑總結

❌ 忘記給 B 專案做初始 commit

→ submodule 無法新增

❌ 沒刪除本機目錄就 add submodule

already exists and is not a git repository

❌ 更新了 B,卻沒提交 A 的 submodule 指標

→ 其他人拉不到最新版本


十一、補充建議

  • 統一子倉庫放在 packages/libs/ 目錄
  • submodule 更新必須有單獨 commit
  • 團隊中約定:禁止直接修改 submodule 的 detached HEAD

結論: submodule 管理的是「依賴的提交」,不是程式碼本身。 想清楚「誰負責發佈,誰負責引用」,就不會踩坑。


如果你願意,我也可以幫你把這篇筆記改成:

  • 團隊規範版
  • README 精簡版
  • 帶流程圖的版本